package com.muc.ui;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.muc.logic.IActivity;
import com.muc.logic.MainService;
import com.muc.logic.Task;
import com.muc.modle.MyAdapter;
import com.muc.modle.Status;
import com.muc.util.ConstTag;
import com.muc.yunbaobao.R;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements IActivity, OnTouchListener, ConstTag
{
	Task								task			= null;
	HashMap<String, Object>				param			= new HashMap<String, Object>();
	List<Status>	st	= new ArrayList<Status>();
	/**
	 * 滚动显示和隐藏menu时，手指滑动需要达到的速度。
	 */
	public static final int				SNAP_VELOCITY	= 200;
	/**
	 * 屏幕宽度值。
	 */
	private int							screenWidth;
	/**
	 * menu最多可以滑动到的左边缘。值由menu布局的宽度来定，marginLeft到达此值之后，不能再减少。
	 */
	private int							leftEdge;
	/**
	 * menu最多可以滑动到的右边缘。值恒为0，即marginLeft到达0之后，不能增加。
	 */
	private int							rightEdge		= 0;
	/**
	 * menu完全显示时，留给content的宽度值。
	 */
	private int							menuPadding		= 80;
	/**
	 * 主内容的布局。
	 */
	private View						content;
	/**
	 * menu的布局。
	 */
	private View						menu;
	/**
	 * menu布局的参数，通过此参数来更改leftMargin的值。
	 */
	private LinearLayout.LayoutParams	menuParams;
	/**
	 * 记录手指按下时的横坐标。
	 */
	private float						xDown;
	/**
	 * 记录手指移动时的横坐标。
	 */
	private float						xMove;
	/**
	 * 记录手机抬起时的横坐标。
	 */
	private float						xUp;
	/**
	 * menu当前是显示还是隐藏。只有完全显示或隐藏menu时才会更改此值，滑动过程中此值无效。
	 */
	private boolean						isMenuVisible;
	/**
	 * 用于计算手指滑动的速度。
	 */
	private VelocityTracker				mVelocityTracker;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		Intent it = new Intent("com.muc.logic.MainService");
		startService(it);
		setContentView(R.layout.activity_main);
		MainService.allActivity.add(this);
		// 判断是否第一次运行
		if (isfirstrun())
		{
			Log.d("activity", "isrunfirst+mainActivity");
			param.clear();
			param.put("class", "MainActivity");
			task = new Task(TASK_DO_FIRST_RUN, param);
			refresh(task);
		}
		init();
		setListener();
		ListView lView = (ListView) findViewById(R.id.listView1);
		MyAdapter myAdapter = new MyAdapter(this, st);
		lView.setAdapter(myAdapter);
	}
	private boolean isfirstrun()
	{
		// TODO Auto-generated method stub
		SharedPreferences sharePerferences = getSharedPreferences("default", Context.MODE_WORLD_READABLE);
		boolean isfirst = sharePerferences.getBoolean("isfirstrun", true);
		return isfirst;
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	@Override
	/**
	 * 初始化一些关键性数据。。
	 */
	public void init()
	{
		Status status = null;
		status = new Status(R.layout.main_item);
		status.addMyContent(STYLE_ImageView, R.id.imageView1, R.drawable.content_tag_jiluzhichi);
		status.addMyContent(STYLE_TextView, R.id.textView1, "Try it...........	");
		
		st.add(status);
		status = new Status(R.layout.main_item_pic);
		status.addMyContent(STYLE_ImageView, R.id.imageView1, R.drawable.content_tag_jiluzhichi);
		status.addMyContent(STYLE_ImageView, R.id.imageView2, R.drawable.content_pic_bg);
		st.add(status);
		status = new Status(R.layout.main_item);
		status.addMyContent(STYLE_ImageView, R.id.imageView1, R.drawable.content_tag_jiluzhichi);
		status.addMyContent(STYLE_TextView, R.id.textView1, "Try it...........	");
		st.add(status);
		st.add(status);
		status = new Status(R.layout.main_item_pic);
		status.addMyContent(STYLE_ImageView, R.id.imageView1, R.drawable.content_tag_jiluzhichi);
		status.addMyContent(STYLE_ImageView, R.id.imageView2, R.drawable.content_pic_bg);
		st.add(status);
		st.add(status);
		status = new Status(R.layout.main_item);
		status.addMyContent(STYLE_ImageView, R.id.imageView1, R.drawable.content_tag_jiluzhichi);
		status.addMyContent(STYLE_TextView, R.id.textView1, "Try it...........	");
		st.add(status);
		// status = new Status(R.layout.nav_list_item_on_off);
		// status.addMyContent(STYLE_ImageView, R.id.imageView2,
		// R.drawable.nav_content_btn_off);
		// st.add(status);
		Log.d("Date", "List Status ready....prepare to show");
		
		
		
		// TODO Auto-generated method stub
		DisplayMetrics dm = getResources().getDisplayMetrics();
		screenWidth = dm.widthPixels;
		content = findViewById(R.id.LinearLayout1);
		menu = findViewById(R.id.LinearLayout2);
		menuParams = (LinearLayout.LayoutParams) menu.getLayoutParams();
		// 将menu的宽度设置为屏幕宽度减去menuPadding
		menuParams.width = screenWidth - menuPadding;
		// 左边缘的值赋值为menu宽度的负数
		leftEdge = -menuParams.width;
		// menu的leftMargin设置为左边缘的值，这样初始化时menu就变为不可见
		menuParams.leftMargin = leftEdge;
		// 将content的宽度设置为屏幕宽度
		content.getLayoutParams().width = screenWidth;
	}
	@Override
	public void refresh(Task task)
	{
		// TODO Auto-generated method stub
		Intent int0 = null;
		switch (task.getTaskID())
		{
			case TASK_DO_FIRST_RUN:
				Log.d("activity", "start+firstinnavActivity");
				int0 = new Intent(MainActivity.this, FirstInNavActivity.class);
				startActivity(int0);
				break;
		// case Task.TASK_DO_LISTPUSH_RUN:
		// Log.d("activity", "start+ListPushActivity");
		// int0 = new Intent(MainActivity.this, ListPushActivity.class);
		// startActivity(int0);
		// break;
		}
	}
	@Override
	public void setListener()
	{
		// TODO Auto-generated method stub
		content.setOnTouchListener(this);
		menu.setOnTouchListener(this);
		Button btn0 = (Button) findViewById(R.id.menu);
		btn0.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// TODO Auto-generated method stub
				if (isMenuVisible)
				{
					scrollToMenu(-30);
				}
				else
				{
					scrollToMenu(30);
				}
			}
		});
		btn0 = (Button) findViewById(R.id.reflash);
		btn0.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, "刷新...", Toast.LENGTH_SHORT).show();
			}
		});
	}
	@Override
	public boolean onTouch(View v, MotionEvent event)
	{
		createVelocityTracker(event);
		switch (event.getAction())
		{
			case MotionEvent.ACTION_DOWN:
				// 手指按下时，记录按下时的横坐标
				xDown = event.getRawX();
				break;
			case MotionEvent.ACTION_MOVE:
				// 手指移动时，对比按下时的横坐标，计算出移动的距离，来调整menu的leftMargin值，从而显示和隐藏menu
				xMove = event.getRawX();
				int distanceX = (int) (xMove - xDown);
				menuParams.leftMargin = isMenuVisible ? distanceX : leftEdge + distanceX;
				if (menuParams.leftMargin < leftEdge)
				{
					menuParams.leftMargin = leftEdge;
				}
				else if (menuParams.leftMargin > rightEdge)
				{
					menuParams.leftMargin = rightEdge;
				}
				menu.setLayoutParams(menuParams);
				break;
			case MotionEvent.ACTION_UP:
				// 手指抬起时，进行判断当前手势的意图，从而决定是滚动到menu界面，还是滚动到content界面
				xUp = event.getRawX();
				if (xUp - xDown != 0)
				{
					scrollToMenu(showMenu());
				}
				recycleVelocityTracker();
				break;
		}
		return true;
	}
	/**
	 * 
	 * 判断当前手势的意图
	 * 
	 * @return 当前手势想显示menu返回true，否则返回false。
	 */
	private int showMenu()
	{
		int i = 30;
		if ((screenWidth / 2 < (xUp - xDown > 0 ? xUp - xDown : xDown - xUp + menuPadding)) || getScrollVelocity() > SNAP_VELOCITY)
		{
			if (xUp - xDown > 0)
			{
				i = 30;
			}
			else
			{
				i = -30;
			}
		}
		return i;
	}
	// 滚动到Menu 负值为滚回到内容
	private void scrollToMenu(int i)
	{
		if (i != 0)
		{
			new ScrollTask().execute(i);
		}
	}
	/**
	 * 创建VelocityTracker对象，并将触摸content界面的滑动事件加入到VelocityTracker当中。
	 * 
	 * @param event
	 *            content界面的滑动事件
	 */
	private void createVelocityTracker(MotionEvent event)
	{
		if (mVelocityTracker == null)
		{
			mVelocityTracker = VelocityTracker.obtain();
		}
		mVelocityTracker.addMovement(event);
	}
	/**
	 * 获取手指在content界面滑动的速度。
	 * 
	 * @return 滑动速度，以每秒钟移动了多少像素值为单位。
	 */
	private int getScrollVelocity()
	{
		mVelocityTracker.computeCurrentVelocity(1000);
		int velocity = (int) mVelocityTracker.getXVelocity();
		return Math.abs(velocity);
	}
	/**
	 * 回收VelocityTracker对象。
	 */
	private void recycleVelocityTracker()
	{
		mVelocityTracker.recycle();
		mVelocityTracker = null;
	}

	class ScrollTask extends AsyncTask<Integer, Integer, Integer>
	{
		@Override
		protected Integer doInBackground(Integer... speed)
		{
			int leftMargin = menuParams.leftMargin;
			// 根据传入的速度来滚动界面，当滚动到达左边界或右边界时，跳出循环。
			while (true)
			{
				leftMargin = leftMargin + speed[0];
				if (leftMargin > rightEdge)
				{
					leftMargin = rightEdge;
					break;
				}
				if (leftMargin < leftEdge)
				{
					leftMargin = leftEdge;
					break;
				}
				publishProgress(leftMargin);
				// 为了要有滚动效果产生，每次循环使线程睡眠20毫秒，这样肉眼才能够看到滚动动画。
				sleep(20);
			}
			if (speed[0] > 0)
			{
				isMenuVisible = true;
			}
			else
			{
				isMenuVisible = false;
			}
			return leftMargin;
		}
		@Override
		protected void onProgressUpdate(Integer... leftMargin)
		{
			menuParams.leftMargin = leftMargin[0];
			menu.setLayoutParams(menuParams);
		}
		@Override
		protected void onPostExecute(Integer leftMargin)
		{
			menuParams.leftMargin = leftMargin;
			menu.setLayoutParams(menuParams);
		}
	}

	/**
	 * 使当前线程睡眠指定的毫秒数。
	 * 
	 * @param millis
	 *            指定当前线程睡眠多久，以毫秒为单位
	 */
	private void sleep(long millis)
	{
		try
		{
			Thread.sleep(millis);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
	@Override
	public void initListener()
	{
		// TODO Auto-generated method stub
	}
}
